home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 423_01 / recio200 / _rcbget.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-15  |  3.1 KB  |  82 lines

  1. /*****************************************************************************
  2.    MODULE: _rcbget.h
  3.   PURPOSE: recio column delimited integral number input functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.   VERSION: 2.00
  6.   RELEASE: April 15, 1994
  7. *****************************************************************************/
  8.  
  9. #ifndef _RCBGET_H
  10. #define _RCBGET_H
  11.  
  12. #include "recio.h"
  13.  
  14. extern int _rstatus(REC *rp, int mode);
  15. extern char *_rfldstr(REC *rp, size_t len);
  16. extern char *_rerrs(REC *rp, int errnum);
  17.  
  18. #define READ 0
  19. #define rcol(rp) (rp->r_colno)
  20.  
  21. /* clip value v between lower l and upper u bounds */
  22. #define range(l, v, u)  (min(max((l),(v)),(u)))
  23.  
  24. /* macro to get column delimited integral number */
  25. #define rcbget_fn( /* define function to get number from record */\
  26.     fn_type,      /* defined function return type */\
  27.     fn_name,      /* defined function name */\
  28.     fn_err,       /* defined function error return value */\
  29.     cv_type,      /* conversion function return type */\
  30.     cv_name,      /* conversion function name */\
  31.     fn_min,       /* inclusive valid minimum value */\
  32.     fn_max)       /* inclusive valid maximum value */\
  33. \
  34. fn_type fn_name(        /* return fn_type, return fn_err on error */\
  35.         REC *rp,        /* record pointer */\
  36.         size_t begcol,  /* field inclusive beginning column */\
  37.         size_t endcol,  /* field inclusive ending column */\
  38.         int base)       /* radix of number */\
  39. { \
  40.     fn_type result=(fn_err); /* result to return */\
  41.     cv_type val;             /* conversion value */\
  42.     char *fldptr;            /* pointer to field string */\
  43.     char *endptr;            /* pointer to first invalid field char */\
  44.     char *fldp;              /* another pointer to field string */\
  45. \
  46.     if (!_rstatus(rp, READ)) { \
  47.       if (endcol >= begcol && begcol >= rbegcolno(rp)) { \
  48.         rcol(rp) = begcol - rbegcolno(rp); \
  49.         fldptr = _rfldstr(rp, endcol-begcol+1); \
  50.         if (fldptr) { \
  51.           for (;;) { \
  52.             for (fldp=fldptr; *fldp; fldp++) {if (!isspace(*fldp)) break;} \
  53.             if (*fldp) { \
  54.               endptr = fldptr; \
  55.               val = cv_name(fldptr, &endptr, base); \
  56.               while (isspace(*endptr)) endptr++; \
  57.               if (errno==ERANGE || !*endptr) { \
  58.                 if (!errno) { \
  59.                   if (val>=(fn_min) && val<=(fn_max)) { \
  60.                     result = (fn_type) val; \
  61.                     goto done; \
  62.                   } \
  63.                 } /* out of range */ \
  64.                 fldptr = _rerrs(rp, R_ERANGE); \
  65.                 if (fldptr) { continue; } else { goto done; } \
  66.               } /* invalid data */ \
  67.               fldptr = _rerrs(rp, R_EINVDAT); \
  68.               if (fldptr) { continue; } else { goto done; } \
  69.             } /* missing data */ \
  70.             fldptr = _rerrs(rp, R_EMISDAT); \
  71.             if (fldptr) { continue; } else { goto done; } \
  72.           } \
  73.         } /* null pointer */ \
  74.       } /* arguments reversed or tried to start before first column*/ \
  75.       rseterr(rp, R_EINVAL); \
  76.     } \
  77. done: \
  78.     return result; \
  79. }
  80.  
  81. #endif
  82.